package org.example.pms.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 解决CORS的跨域问题，继承HttpFilter，重写doFiler过滤规则即可。
 * <p>
 * 方式二：通过过滤器配置CORS实现，修改addCorsMappings的配置规则，手动设置响应头 (HttpServletResponse)即可。
 */
@Component
public class CorsFilter extends HttpFilter {

    @Value("${cors.web_uri}")
    String corsWebUri;

    /**
     * 处理跨域请求的过滤方法
     *
     *  * 解决CORS的跨域问题，继承HttpFilter，重写doFiler过滤规则即可。
     *  * <p>
     *  * 方式二：通过过滤器配置CORS实现，修改addCorsMappings的配置规则，手动设置响应头 (HttpServletResponse)即可。
     *
     * @param request  客户端发送的 HTTP 请求
     * @param response 服务端响应的 HTTP 响应
     * @param chain    过滤器链，用于将请求传递给后续的过滤器或目标资源
     * @throws IOException      如果在处理输入/输出时发生错误
     * @throws ServletException 如果在处理 Servlet 相关操作时发生错误
     */
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 设置允许的域(一般为发起请求的服务器地址，如：前端服务地址 http://localhost:8081)
        response.setHeader("Access-Control-Allow-Origin", corsWebUri);
        // 设置允许的请求方法
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        // 设置允许的请求头
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
        // 设置是否允许携带凭证（如 Cookie）
        response.setHeader("Access-Control-Allow-Credentials", "true");
        // 将请求传递给后续的过滤器或目标资源
        chain.doFilter(request, response);
    }

    /**
     * 初始化过滤器的方法，在过滤器创建时被调用
     *
     * @param filterConfig 过滤器配置对象
     * @throws ServletException 如果初始化过程中发生错误
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化方法，可以留空

    }

    /**
     * 销毁过滤器的方法，在过滤器被销毁时被调用
     */
    @Override
    public void destroy() {
        // 销毁方法，可以留空
    }
}